
local mt = {}
mt.__index = mt

function mt.New(cls)
    local self = setmetatable({}, cls)
    self._listeners = {}
    return self
end

function mt:add(listener)
    table.insert(self._listeners,listener)
end

function mt:remove(listener)
    local fidx = nil
    for idx, cb in ipairs(self._listeners) do
        if cb == listener then
            fidx = idx
            break
        end
    end
    if fidx then
        table.remove(self._listeners, fidx)
        return true
    end
    return false
end

function mt:emit(...)
    for idx,listener in ipairs(self._listeners) do
        --pcall(listener, ...)
        listener(...)
    end
end

return mt
